/**
 * message_queue.h
 *
 *  Created on: 2017年4月6日
 *      Author: chenshisheng
 */

#ifndef MESSAGE_QUEUE_H_
#define MESSAGE_QUEUE_H_

#include "main.h"

BEGIN_C_DECLS
// 单个消息的最大长度
#define MSGQUEUE_MSG_MAX_SIZE  128

// 消息标识
typedef enum
{
    MsgQueue_Id_ShellLineIn = 0,
    MsgQueue_Id_Callback,
    MsgQueue_Id_SerialTest,
	MsgQueue_Id_Debug,
	MsgQueue_Id_Jump,
    MsgQueue_Id_PowerOff,
    MsgQueue_Id_MsgIn,
    MsgQueue_Id_CommDevError,

    MsgQueue_Id_Max
}MsgQueue_Id_t;

// 消息结构
typedef struct
{
    MsgQueue_Id_t id;  // 标识
    unsigned int size; // 数据长度
    uint8_t data[MSGQUEUE_MSG_MAX_SIZE]; // 数据
}MsgQueue_Msg_t;

void MsgQueue_Init(Callback_t globalNotify);
int MsgQueue_Send(MsgQueue_Id_t id, const void *dataIn, unsigned int size);
int MsgQueue_Recv(MsgQueue_Msg_t *msgOut);
void MsgQueue_Service(void);

/**
 * @brief 使callback在main主循环中调用
 * @param callback 回调函数
 * @param arg 回调函数的形参
 */
static inline void MsgQueue_CallLater(Callback_t callback, void *arg)
{
    Callback_Info_t info;

    if(callback != NULL)
    {
        info.callback = callback;
        info.arg = arg;
        MsgQueue_Send(MsgQueue_Id_Callback, &info, sizeof(info));
    }
}

END_C_DECLS
#endif /* MESSAGE_QUEUE_H_ */
